<?php

namespace System\Types;

class Enum extends Object
{

    private $value = array();

    /**
     * @access private
     */
    public function __construct(Array $enum)
    {
        parent::__construct();
        if (!\count($enum))
            throw new \System\Core\Errors\Exceptions('Não é possível criar um enumerado vazio.');

        foreach ($enum as $key => $value)
        {
            if (!\is_string($key))
                throw new \System\Core\Errors\Exceptions('O array de enumerado é inválido.');

            if (\is_string($value))
                $this->value[$key] = new String($value);
            else if (\is_bool($value))
                $this->value[$key] = new Boolean($value);
            else if (\is_int($value) && \is_finite($value))
                $this->value[$key] = new Integer($value);
            else if (\is_float($value) && \is_finite($value))
                $this->value[$key] = new Decimal($value);
            else
                throw new \System\Core\Errors\Exceptions('O array de enumerado é inválido.');
        }
    }

    public function __get($var)
    {
        if (!isset($this->value[$var]))
            throw new \System\Core\Errors\Exceptions('Não foi possível encontrar o valor de enumerado solicitado.');

        return $this->value[$var];
    }

    public function __set($var, $value)
    {
        $var = $var;
        $value = $value;
        throw new \System\Core\Errors\Exceptions('Não é possível alterar o valor de um enumerado.');
    }

}
